جزوه · مفهوم Pipe (لوله) در لینوکس ← بازگشت به فهرست
📘 فصل اول · قسمت شانزدهم مفهوم Pipe (لوله) در لینوکس
📅 تاریخ: ۱۸ مرداد ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian

▍ مقدمه

Pipe (لوله) یکی از قدرتمندترین مفاهیم در لینوکس است که با علامت | نشان داده می‌شود. Pipe به شما اجازه می‌دهد خروجی یک فرمان را به عنوان ورودی فرمان دیگر ارسال کنید.

🔑 مفهوم اصلی:

با استفاده از Pipe، می‌توانید چندین فرمان را به هم متصل کنید و یک زنجیره از فرمان‌ها بسازید که هر کدام خروجی خود را به فرمان بعدی می‌دهند.

▍ تفاوت Pipe با Redirection

ویژگی Pipe (|) Redirection (>)
هدف ارسال خروجی به فرمان دیگر ارسال خروجی به فایل
نحوه کار خروجی یک دستور، ورودی دستور بعدی می‌شود خروجی در یک فایل ذخیره می‌شود
مثال ls | grep ".txt" ls > files.txt

▍ نمایش تصویری Pipe

command1 | command2 (خروجی command1 → ورودی command2)

▍ مثال‌های پایه

• شمارش فایل‌های یک دایرکتوری

┌──(ya3in㉿kali)-[~] └─$ ls -1 | wc -l 12

توضیح: خروجی ls -1 (لیست فایل‌ها) به wc -l (شمارش خطوط) داده می‌شود.

• جستجو در خروجی یک فرمان

┌──(ya3in㉿kali)-[~] └─$ ps aux | grep firefox user 1234 2.5 3.1 ... /usr/bin/firefox

توضیح: فرایندهای در حال اجرا را با ps aux می‌گیرد و با grep فقط موارد مربوط به firefox را نمایش می‌دهد.

• نمایش فقط دایرکتوری‌ها

┌──(ya3in㉿kali)-[~] └─$ ls -la | grep "^d" drwxr-xr-x 5 user user 4096 Aug 18 10:30 .
drwxr-xr-x 3 root root 4096 Aug 18 08:15 ..
drwxr-xr-x 2 user user 4096 Aug 18 09:00 Desktop

توضیح: ls -la همه فایل‌ها را نمایش می‌دهد و grep "^d" فقط خطوطی که با d (دایرکتوری) شروع می‌شوند را نشان می‌دهد.

▍ زنجیره‌های Pipe (چندین Pipe)

می‌توانید چندین Pipe را پشت سر هم قرار دهید و زنجیره‌ای از فرمان‌ها بسازید.

┌──(ya3in㉿kali)-[~] └─$ cat /var/log/syslog | grep "error" | head -n 10

توضیح:

  1. cat /var/log/syslog → نمایش محتوای فایل لاگ
  2. grep "error" → فیلتر کردن خطوط حاوی "error"
  3. head -n 10 → نمایش فقط ۱۰ خط اول
cat syslog | grep error | head -10

• مثال پیشرفته‌تر

┌──(ya3in㉿kali)-[~] └─$ history | grep "sudo" | wc -l

توضیح: تعداد دفعاتی که از sudo استفاده کرده‌اید را نشان می‌دهد.

▍ ترکیب Pipe با Redirection

می‌توانید Pipe و Redirection را با هم ترکیب کنید تا خروجی نهایی را در یک فایل ذخیره کنید.

┌──(ya3in㉿kali)-[~] └─$ ls -la | grep ".txt" > txt_files.txt

توضیح: ابتدا فایل‌های .txt را با grep پیدا می‌کند، سپس خروجی را در txt_files.txt ذخیره می‌کند.

┌──(ya3in㉿kali)-[~] └─$ ps aux | grep firefox | tee firefox_processes.txt

توضیح: tee هم خروجی را در ترمینال نشان می‌دهد و هم در فایل ذخیره می‌کند.

▍ جدول مثال‌های پرکاربرد

دستور کاربرد
ls -la | less مشاهده صفحه‌به‌صفحه خروجی ls
history | grep "apt" پیدا کردن دستورات apt در تاریخچه
cat file.txt | sort | uniq مرتب‌سازی و حذف تکراری‌ها
ps aux | sort -nrk 3 | head -5 نمایش ۵ فرایند با بیشترین مصرف CPU
find . -name "*.txt" | xargs grep "error" جستجوی "error" در همه فایل‌های .txt
dmesg | tail -20 نمایش ۲۰ خط آخر پیام‌های کرنل

▍ نکات مهم و خطاهای رایج

⚠️ خطاهای رایج:
  • فراموش کردن فاصله: حتماً بین دستورات و | فاصله بگذارید.
    ls|grep txtغلط ls | grep txtدرست
  • فرمان اشتباه در زنجیره: اگر یک فرمان در زنجیره خطا دهد، کل زنجیره متوقف می‌شود.
  • استفاده از | با دستورات interactive: برخی دستورات (مثل vim) نمی‌توانند ورودی Pipe را بگیرند.
💡 نکات کلیدی:
  • Pipe (|) خروجی یک فرمان را به ورودی فرمان دیگر می‌دهد.
  • می‌توانید چندین Pipe را پشت سر هم قرار دهید.
  • Pipe با Redirection (>) فرق دارد که خروجی را به فایل می‌فرستد.
  • Pipe یک مفهوم بنیادی در فلسفه طراحی لینوکس است.
  • ترکیب Pipe و Redirection به شما امکان ذخیره خروجی نهایی را می‌دهد.
✅ تمرین پیشنهادی:
  • با ls -la | grep "^d" | wc -l تعداد دایرکتوری‌های فعلی را بشمارید.
  • با history | grep "sudo" | tail -5 ۵ دستور اخیر دارای sudo را ببینید.
  • با cat /etc/passwd | cut -d: -f1 | sort لیست کاربران سیستم را مرتب کنید.
  • خروجی ps aux را به grep و سپس به less بدهید.